package day6;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

public class Homework {
    public static void main(String[] args) throws IllegalAccessException {
        demo2();
    }
    //a.使用反射获取String类的所有方法名  并且 打印方法总数
    //  同时 还要显示按字母排序后的前5个方法名
    public static void demo1(){
        Class c=String.class;
        Method[] ms=c.getDeclaredMethods();
        System.out.println("总数:"+ms.length);
        List<String> list=new ArrayList<>();
        for(Method m:ms){
            list.add(m.getName());
        }
        Collections.sort(list); //默认按照String排序
        for(int i=0;i<5;i++){
            System.out.println(list.get(i));
        }

        //比较器对象:comparator 目的是用于告诉集合或者数组
        //按照什么属性进行排序  基本类型和String一般都可以默认排序的
        //abc  aaa   123  Abc
        //123  Abc   aaa  abc
        //Comparator==> int compare(T o1,T o2)
        //返回值int用于表示大小 >0 <0 =0 来决定o1和o2的大小
//        Comparator<Method> com=(o1,o2)->{
//           return o1.getName().compareTo(o2.getName());
//        };
//        Arrays.sort(ms,com);
//        System.out.println(Arrays.toString(ms));
    }
    //b.通过反射编写一个通用方法实现对象属性赋值功能，能够将一个对象的
    //属性值复制到另一个对象(同名属性)
    //同一个类的属性复制   不同的类的属性复制
    public static void demo2() throws IllegalAccessException {
        Target1 t1=new Target1();
        t1.a="java";
        t1.b="mysql";
        t1.c="spring";
        Target2 t2=new Target2();
        copyField(t1,t2);
        System.out.println(t1);
        System.out.println(t2);

    }
    public static void copyField(Object o1,Object o2) throws IllegalAccessException {
        Class c1=o1.getClass();
        Class c2=o2.getClass();
        Field[] ms1=c1.getDeclaredFields();
        Field[] ms2=c2.getDeclaredFields();
        for(Field m1:ms1){
            for(Field m2:ms2){
                //名称一样 并且 类型地址也相同
                if(m1.getName().equals(m2.getName()) && m1.getType()==m2.getType()){
                    //原对象属性要获取  目标对象属性要设置
                    m2.set(o2,m1.get(o1));
                }
            }
        }
    }
}
class Target1{
    String a;
    String b;
    String c;
    public String toString() {
        return "Target1{" +
                "a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                '}';
    }
}
class Target2{
    String b; //类型和名称都一样
    Integer c;//名称一样 类型不一样
    String d;
    public String toString() {
        return "Target2{" +
                "b='" + b + '\'' +
                ", c=" + c +
                ", d='" + d + '\'' +
                '}';
    }
}

//自定义泛型
class My<A>{
    //类型 参数 不太确定  还想进行统一规范
    public void test(A a,A a2){

    }
    public static void main(String[] args) {
        My<Integer> m=new My();
        m.test(10,20);//Integer
        My<String> m2=new My<>();
        m2.test("a","b");
        List<String> list=new ArrayList<>();

        Integer[] nums={1,7,10,2,4};
        Arrays.sort(nums);//默认按照数字升序
        System.out.println(Arrays.toString(nums));
        //Comparator<Integer> com=(o1,o2)-> o2-o1;
        Arrays.sort(nums,(o1,o2)-> o2-o1); //降序
        System.out.println(Arrays.toString(nums));
    }
}